package Util;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.StringTokenizer;

/**
 *
 * @author klone
 */
public class Fecha {

    public Fecha() {
    }

    /**
     * extencion de java.util.SimpleDateFormat
     * @param formato
     *  String de formato ejemplo:
     * <center>getFecha("dd/MM/yyyy")<br /> return 05/04/2009</center>
     * @see SimpleDateFormat
     * @return
     */
    public static String getFecha(String formato) {
        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     *  Este metodo funciona con objets tipo sqlDate
     * @param formato
     * @param date
     * @return
     */
    public static String getFecha(String formato, java.sql.Date date) {
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     * Este metodo funciona con objets tipo utilDate
     * @param formato
     * @param date
     * @return
     */
    public static String getFecha(String formato, Date date) {
        SimpleDateFormat formating = new SimpleDateFormat(formato);
        return formating.format(date);

    }

    /**
     * retorna la fecha en español en formato YYYY/MMMM/DD
     * <sub>
     * <br />  YYYY= AÑO EN CUATRO DIGITOS ejemplo 2009
     * <br />  MMMM= MES EN ESPAÑOL ejemplo ABRIL
     * <br />  DD= DIA DEL MES  ejemplo 05</sub>
     * @param separador
     * Se usa para separar la cadena de fecha por ejemplo:
     * <br />
     * <center> getFechaCompletaEsp("/")
     * <br />return 2009/ABRIL/05  </center>
     * @return
     */
    public static String getFechaCompletaEsp(String separador) {
        Date date = new Date();
        SimpleDateFormat formating = new SimpleDateFormat("yyyy,MM,dd");

        StringBuffer buffer = new StringBuffer();
        StringTokenizer tokens = new StringTokenizer(formating.format(date), ",");
        buffer.append(tokens.nextElement().toString());
        buffer.append(separador);

        switch (Integer.parseInt(tokens.nextElement().toString())) {
            case 1:
                buffer.append("Enero");
                break;
            case 2:
                buffer.append("Febrero");
                break;
            case 3:
                buffer.append("Marzo");
                break;
            case 4:
                buffer.append("Abril");
                break;
            case 5:
                buffer.append("Mayo");
                break;
            case 6:
                buffer.append("Junio");
                break;
            case 7:
                buffer.append("Julio");
                break;
            case 8:
                buffer.append("Agosto");
                break;
            case 9:
                buffer.append("Septiembre");
                break;
            case 10:
                buffer.append("Octubre");
                break;
            case 11:
                buffer.append("Nobiembre");
                break;
            case 12:
                buffer.append("Diciembre");
                break;
        }
        buffer.append(separador);
        buffer.append(tokens.nextElement().toString());
        return buffer.toString().toUpperCase();
    }

    /**
     *Este metodo es utilizado para  saber en dos letras el dia de la semana<br />
     * y lo calcula por medio de la clase Calendar jsugando el dia de la semana
     * @return "Lu","Ma","Mi,"Ju","Vi","Sa","Do"
     * @see Calendar
     */
    public static String getDiaSemana() {
        String dia = "";
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        int diaInt = cal.get(Calendar.DAY_OF_WEEK);
        switch (diaInt) {
            case 1:
                dia = "Do";
                break;
            case 2:
                dia = "Lu";
                break;
            case 3:
                dia = "Ma";
                break;
            case 4:
                dia = "Mi";
                break;
            case 5:
                dia = "Ju";
                break;
            case 6:
                dia = "Vi";
                break;
            case 7:
                dia = "Sa";
                break;

        }
        return dia;
    }

    /**
     *Este metodo es utilizado para  saber en numero el dia de la semana<br />
     * y lo calcula por medio de la clase Calendar jsugando el dia de la semana
     * @return 1,2,3,4,5,6,7
     * @see Calendar
     */
    public static int getDiaSemanaInt() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        return cal.get(Calendar.DAY_OF_WEEK) + 1;
    }

    /**
     * Resta un determidado numero de minutos a una hora especificada en un Calendar
     * <b>NO SE PODRA RESTAR MAS DE 60MINUTOS</B>
     * @param cal
     * @param minutosAgregar
     * @see Calendar
     */
    public static Calendar restaMinutos(Calendar cal, int mintuosARestar) {
        Calendar calendar = Calendar.getInstance();
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minuto = cal.get(Calendar.MINUTE);
        if (minuto - mintuosARestar < 0) {
            int nuevoMinuto = 60 - mintuosARestar;
            calendar.set(0, 0, 0, hora - 1, nuevoMinuto);
        } else {
            calendar.set(0, 0, 0, hora, calendar.get(Calendar.MINUTE) - mintuosARestar);
        }
        return calendar;
    }

    /**
     * Agrega un determidado numero de minutos a una hora especificada en un Calendar
     * * <b>NO SE PODRA AGREGAR MAS DE 60MINUTOS</B>
     * @param cal
     * @param minutosAgregar
     * @see Calendar
     */
    public static Calendar agregaMinutos(Calendar cal, int minutosAgregar) {
        Calendar calendar = Calendar.getInstance();
        int hora = cal.get(Calendar.HOUR_OF_DAY);
        int minuto = cal.get(Calendar.MINUTE);
        if (minuto + minutosAgregar >= 60) {
            int nuevoMinuto = minuto - 60;
            nuevoMinuto -= minutosAgregar;
            calendar.set(0, 0, 0, (hora + 1), nuevoMinuto, Calendar.MINUTE);
        } else {
            calendar.set(0, 0, 0, hora, cal.get(Calendar.MINUTE) + minutosAgregar);
        }
        return calendar;
    }

    /**
     * comp es el Calendar a comparar return true si cal menor comp si no false
     * @param cal
     * @param comp
     * @return
     */
    public static boolean esMenor(Calendar cal, Calendar comp) {
        if (cal.compareTo(comp) <= 0) {
            return true;
        } else {
            return false;
        }

    }

    /**
     *
     * @param cal
     * @param comp
     * @return
     */
    public static boolean esMayorIgual(Calendar cal, Calendar comp) {

        if (cal.compareTo(comp) > 0) {
            return true;

        } else {
            return false;
        }

    }

    /**
     *
     * @param buscar
     * @param menor
     * @param mayor
     * @return boolean
     */
    public static boolean esEntre(Calendar buscar, Calendar menor, Calendar mayor) {

        if (esMayorIgual(buscar, menor) && esMenor(buscar, mayor)) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * Este metodo funciona para encontrar la diferencia en dias entre dos Calendar
     * @param inicio
     * @param fin
     * @return
     */
    public static long diferenciaDates(Calendar inicio, Calendar fin) {
        long diferenciaMilis = fin.getTimeInMillis() - inicio.getTimeInMillis();
        long diferenciaDias = diferenciaMilis / (1000 * 60 * 60 * 24);
        return diferenciaDias;

    }

    public static java.util.Date sumarFechasDias(java.util.Date fch, int dias) {
        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fch.getTime());
        cal.add(Calendar.DATE, dias);
        return new java.util.Date(cal.getTimeInMillis());
    }
}